package com.demo.java.OD351_400.OD377;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【告警抑制(B卷)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146234349
 */
public class OdMain {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        // 读取输入数据
        List<String[]> lines = new ArrayList<>();
        String line;

        // 读取所有输入行，直到没有输入或者输入为空
        while ((line = reader.readLine()) != null && !line.isEmpty()) {
            lines.add(line.split(" "));
        }

        // 任务依赖关系映射
        Map<String, List<String>> relations = new HashMap<>();

        // 队列中执行的任务，取输入的最后一行
        String[] queue = lines.get(lines.size() - 1);

        // 处理任务的依赖关系（从第2行到倒数第二行）
        for (int i = 0; i < lines.size() - 1; i++) {
            String[] splits = lines.get(i);
            String key = splits[0];
            String value = splits[1];
            relations.putIfAbsent(key, new ArrayList<>());
            relations.get(key).add(value); // 建立任务依赖关系
        }

        // 存储所有无法执行的任务
        Set<String> deletes = new HashSet<>();
        // 遍历队列，检查每个任务依赖的任务
        for (String key : queue) {
            if (relations.containsKey(key)) {
                deletes.addAll(relations.get(key)); // 将依赖任务加入删除集合
            }
        }

        // 构建最终输出的任务队列
        StringBuilder result = new StringBuilder();
        for (String e : queue) {
            if (!deletes.contains(e)) { // 只输出未被删除的任务
                result.append(e).append(" ");
            }
        }

        // 输出最终的任务队列
        System.out.println(result.toString().trim());
    }
}
